﻿using System.Collections.Generic;
using System.Text.RegularExpressions;
using System;
using System.IO;
using System.Text;
using System.Data.SqlClient;

namespace Prassi2ExpertUpTransfer
{



    // Record Trasfer ExpertUp
    public abstract class RecordTrasferExpertUp
    {
        private int nrReg;

        public abstract string TipoRecord();

        public int NrReg { get { return this.nrReg; } set { this.nrReg = value; } }

        public abstract string TransformaInStringa();

    }


    public class TrasferExpertUp
    {

        // records del trasfer
        private List<RecordTrasferExpertUp> recordTrasferExpUp = new List<RecordTrasferExpertUp>();

        public TrasferExpertUp()
        {

        }


        public static TrasferExpertUp ElaboraTrasferPrassi(TrasferPrassi tp)
        {
            TrasferExpertUp teu = new TrasferExpertUp();

            // 001 Intestazione e riconoscimento Release.
            RecordExpertUp_001 tr001 = teu.CreaRecord_001(tp);
            teu.recordTrasferExpUp.Add(tr001);

            // 010 identificazione ditta ricevente
            RecordExpertUp_010 tr010 = teu.CreaRecord_010(tp);
            teu.recordTrasferExpUp.Add(tr010);
                        
            // Tira fuori tutti i nrreg;
            List<int> lstNrRegPrassi = tp.TuttiNrReg();

            // Ciclo su tutti i numeri registrazione creando per ciascuno
            // i tipi record ExpertUp necessari;
            foreach (int nrRegPrassi in lstNrRegPrassi) 
            {

                // 070 testata registrazione
                RecordExpertUp_070 tr070 = teu.CreaRecord_070(nrRegPrassi, tp);
                teu.recordTrasferExpUp.Add(tr070);
                
                // 073 righe dettaglio registrazione contabile
                List<RecordExpertUp_073> list_tr073 = tp.CreaRecords_073(nrRegPrassi);
                teu.recordTrasferExpUp.AddRange(list_tr073);

                // 076 righe dettaglio iva ... se presenti
                if (tp.Is_U1(nrRegPrassi))
                {
                    List<RecordExpertUp_076> list_tr076 = tp.CreaRecords_076(nrRegPrassi);
                    teu.recordTrasferExpUp.AddRange(list_tr076);
                }

                // 079 righe dettaglio scadenze ... se presenti
                if (tp.Is_B1(nrRegPrassi))
                {
                    List<RecordExpertUp_079> list_tr079 = tp.CreaRecords_079(nrRegPrassi);
                    teu.recordTrasferExpUp.AddRange(list_tr079);
                }
            }

            ConnettiExpUpDB.Instanza.CloseConnection();

            return teu;
        }

        public bool ScriviTrasferExpertUp(string path_FileTrasferPrassi, TrasferPrassi tp)
        {

            StringBuilder recExpUpStrBuild = new StringBuilder();

            string path_FileTrasferExpertUp = null;

            // preparo il nome del file convertito
            path_FileTrasferExpertUp = Regex.Replace(path_FileTrasferPrassi,
                ".txt", "_ExpUp.txt", RegexOptions.IgnoreCase);

            // gestione scrittura dal list di classi recordTrasferExpUp al file di testo 
            try
            {
                // Ciclo tutti i record del list recordTrasferExpUp
                foreach (RecordTrasferExpertUp recTraExUp in recordTrasferExpUp)
                {
                    recExpUpStrBuild.AppendLine(recTraExUp.TransformaInStringa());
                }
                
                System.IO.File.Delete(path_FileTrasferExpertUp);

                FileStream fileTrasferExpertUp = new FileStream(path_FileTrasferExpertUp, FileMode.Append, FileAccess.Write, FileShare.None);
                StreamWriter fileTrasferExpertUpSW = new StreamWriter(fileTrasferExpertUp);

                fileTrasferExpertUpSW.Write(recExpUpStrBuild.ToString());

                fileTrasferExpertUpSW.Flush();
                fileTrasferExpertUpSW.Close();

                // Aggiorno la sequenza dell'ultimo invio
                tp.AggiornaSequenzaInvio();
            }
            catch (Exception err)
            {
                // TODO Exception rilanciata
                throw err;
            }


            return true;
        }

        public RecordExpertUp_001 CreaRecord_001(TrasferPrassi tp)
        {

            RecordExpertUp_001 tr001 = new RecordExpertUp_001();

            tr001.Tr001_DataCreazione = tp.DataTrasferimento();
            tr001.Tr001_Descrizione = null;

            return tr001;
        }


        public RecordExpertUp_010 CreaRecord_010(TrasferPrassi tp)
        {

            RecordExpertUp_010 tr010 = new RecordExpertUp_010();

            tr010.Tr010_CodDitta = tp.CodiceDitta();
            try
            {
                tr010.Tr010_MeseFineEser = Convert.ToInt32(ConnettiExpUpDB.Instanza.getValueInt("MeseFinPeriodoFisc", "ENTA0000", "where Entita = " + tr010.Tr010_CodDitta));
                tr010.Tr010_AnnoFineEser = Convert.ToInt32(ConnettiExpUpDB.Instanza.getValueInt("AnnoFinPeriodoFisc", "ENTA0000", "where Entita = " + tr010.Tr010_CodDitta));
                // recupero il codice Anagrafico per recuperare da ANAA000 la partita IVA
                string CodAnagrafico = ConnettiExpUpDB.Instanza.getValue("CodAnagrafico", "ENTA0000", "where Entita = " + tr010.Tr010_CodDitta);
                if (CodAnagrafico.Length > 0)
                {
                    tr010.Tr010_PartitaIVA = ConnettiExpUpDB.Instanza.getValue("PartitaIva", "ANAA0000", "where codAnagrafico = " + CodAnagrafico);
                }
            }
            catch (Exception err)
            {
                // TODO Exception rilanciata
                throw err;
            }

            return tr010;
        }
        

        public RecordExpertUp_070 CreaRecord_070(int nrReg, TrasferPrassi tp)
        {

            RecordExpertUp_070 tr070 = new RecordExpertUp_070();

            tr070.Tr070_DataReg = tp.DataRegistrazione(nrReg);
            tr070.Tr070_NrProtoc = tp.NrProtocolloIVA(nrReg);
            tr070.Tr070_CompEser = tp.AnnoRiferimentoCoGe(nrReg);
            tr070.Tr070_CausContab = tp.CausaleCoGe(nrReg);
            tr070.Tr070_DescrMov = null;
            tr070.Tr070_NrDocum = tp.NrDocumento(nrReg);
            tr070.Tr070_DataDocum = tp.DataDocumento(nrReg);
            tr070.Tr070_MastroClFo = tp.MastroCliFor(nrReg);
            tr070.Tr070_ContoClFo = tp.ContoCliFor(nrReg);
            tr070.Tr070_CodClFo = tp.CodiceCliFor(nrReg);
            tr070.Tr070_ImpTotDoc = tp.ImportoTotaleDoc(nrReg);
            tr070.Tr070_NrRegistr = nrReg;

            return tr070;
        }
       
    }

    
    #region sottoclassi di RecordTrasferExpertUp

    #region sottoclasse TipoRecord "001"
        // - Obbligatorio e Unico
        // - Intestazione e riconoscimento Release.
    public class RecordExpertUp_001 : RecordTrasferExpertUp
    {
        public override string TipoRecord()
        {
            return "001";
        }

        #region campi del record "001"

        private string tr001_IdFisso = "DylogTracciatoRecordImportazioneRel."; // Identificativo fisso
        public string Tr001_IdFisso { get { return this.tr001_IdFisso; } }

        private string tr001_Release = "01.04.00"; // Release del tracciato Record
        public string Tr001_Release { get { return this.tr001_Release; } }

        private string tr001_Descrizione; // Descrizione del contenuto del file
        public string Tr001_Descrizione { get { return this.tr001_Descrizione; } set { this.tr001_Descrizione = value; } }

        private DateTime tr001_DataCreazione; // data creazione del file (gg/mm/aaaa)
        public DateTime Tr001_DataCreazione { get { return this.tr001_DataCreazione; } set { this.tr001_DataCreazione = value; } }

        #endregion

        public override string TransformaInStringa()
        {

            string record = TipoRecord()

            + String.Format("{0,-36}", tr001_IdFisso) // Identificativo fisso
            + String.Format("{0,-8}", Tr001_Release) // Release del tracciato Record
            + String.Format("{0,-50}", Tr001_Descrizione) // Descrizione del contenuto del file
            + String.Format("{0:dd/MM/yyyy}", Tr001_DataCreazione); // data creazione del file (gg/mm/aaaa)

            return record;
        }


    }
    #endregion

    #region sottoclasse TipoRecord "010"
    // - Obbligatorio e Unico
    // - Identificazione Ditta
    public class RecordExpertUp_010 : RecordTrasferExpertUp
    {
        public override string TipoRecord()
        {
            return "010";
        }

        #region campi del record "010"

        private int tr010_CodDitta; // Codice ditta di destinazione dati
        public int Tr010_CodDitta { get { return this.tr010_CodDitta; } set { this.tr010_CodDitta = value; } }

        private string tr010_PartitaIVA; // Partita IVA della ditta di destinazione dati
        public string Tr010_PartitaIVA 
        { 
            get {
                    if (this.tr010_PartitaIVA == null)
                    {
                        return "00000000000";
                    }
                    else
                    {
                        return this.tr010_PartitaIVA;
                    }
                }
            set { this.tr010_PartitaIVA = value; }
        }

        private int tr010_MeseFineEser; // Mese di Fine dell'Esercizio Contabile
        public int Tr010_MeseFineEser { get { return this.tr010_MeseFineEser; } set { this.tr010_MeseFineEser = value; } }

        private int tr010_AnnoFineEser; // Anno di Fine dell'Esercizio Contabile
        public int Tr010_AnnoFineEser { get { return this.tr010_AnnoFineEser; } set { this.tr010_AnnoFineEser = value; } }

        private string tr010_TipoContab = "O"; // Tipo contabilità (NON usato da noi sempre "O"!!!)
        public string Tr010_TipoContab { get { return this.tr010_TipoContab; } }

        private int tr010_LivelloGest = 0; // Livello di gestione (NON usato da noi sempre "0"!!!)
        public int Tr010_LivelloGest { get { return this.tr010_LivelloGest; } }

        #endregion

        public override string TransformaInStringa()
        {

            string record = TipoRecord()

            + String.Format("{0:0000}", Tr010_CodDitta) // Codice ditta di destinazione dati
            + String.Format("{0,-12}", Tr010_PartitaIVA) // Partita IVA della ditta di destinazione dati
            + String.Format("{0:00}", Tr010_MeseFineEser) // Mese di Fine dell'Esercizio Contabile
            + String.Format("{0:0000}", Tr010_AnnoFineEser) // Anno di Fine dell'Esercizio Contabile
            + String.Format("{0,-1}", Tr010_TipoContab.Trim()) // Tipo contabilità
            + String.Format("{0:0}", Tr010_LivelloGest); // Livello di gestione

            return record;
        }


    }
    #endregion
    
    #region sottoclasse TipoRecord "070"
            // - Facoltativo e Ripetibile
            // - Testata del Movimento Contabile.

    public class RecordExpertUp_070 : RecordTrasferExpertUp
    {
        public override string TipoRecord()
        {
            return "070";
        }
        #region campi del record "070"

        private DateTime tr070_DataReg; // data registrazione (gg/mm/aaaa)
        public DateTime Tr070_DataReg { get { return this.tr070_DataReg; } set { this.tr070_DataReg = value; } }

        private int tr070_NrSezIva = 1; // Numero della Sezione Iva (default 001)
        public int Tr070_NrSezIva { get { return this.tr070_NrSezIva; } }
        
        private int tr070_NrProtoc; // Numero di Protocollo
        public int Tr070_NrProtoc { get { return this.tr070_NrProtoc; } set { this.tr070_NrProtoc = value; } }
        
        private string tr070_CompEser; // Esercizio di competenza ("C"=Corrente (Default) "P"=Precedente)
        public string Tr070_CompEser { get { return this.tr070_CompEser; } set { this.tr070_CompEser = value; } }
        
        private string tr070_MovOscCamb = " ";// Flag movimento oscillazione cambi
        public string Tr070_MovOscCamb { get { return this.tr070_MovOscCamb; } }
        
        private string tr070_CausContab; // Codice di causale contabile
        public string Tr070_CausContab { get { return this.tr070_CausContab; } set { this.tr070_CausContab = value; } }
        
        private string tr070_DescrMov; // Descrizione movimento
        public string Tr070_DescrMov { get { return this.tr070_DescrMov; } set { this.tr070_DescrMov = value; } }

        private string tr070_NrDocum; // Numero documento
        public string Tr070_NrDocum { get { return this.tr070_NrDocum; } set { this.tr070_NrDocum = value; } }

        private DateTime tr070_DataDocum; // Data documento (gg/mm/aaaa)
        public DateTime Tr070_DataDocum { get { return this.tr070_DataDocum; } set { this.tr070_DataDocum = value; } }

        private int tr070_MastroClFo; // Mastro cliente o fornitore
        public int Tr070_MastroClFo { get { return this.tr070_MastroClFo; } set { this.tr070_MastroClFo = value; } }

        private int tr070_CapocClFo = 0; // Capoconto cliente o fornitore (NON usato da noi sempre 0!!!)
        public int Tr070_CapocClFo { get { return this.tr070_CapocClFo; } }

        private int tr070_ContoClFo; // Conto cliente o fornitore
        public int Tr070_ContoClFo { get { return this.tr070_ContoClFo; } set { this.tr070_ContoClFo = value; } }

        private int tr070_CodClFo; // Codice cliente o fornitore
        public int Tr070_CodClFo { get { return this.tr070_CodClFo; } set { this.tr070_CodClFo = value; } }

        private double tr070_ImpTotDoc; // Importo totale documento
        public double Tr070_ImpTotDoc { get { return this.tr070_ImpTotDoc; } set { this.tr070_ImpTotDoc = value; } }

        private string tr070_SegnoDoc = "+"; // Segno totale documento (NON usato da noi sempre "+"!!!)
        public string Tr070_SegnoDoc { get { return this.tr070_SegnoDoc; } }

        private double tr070_ImpTotArr = 0; // Importo totale arrotondamento
        public double Tr070_ImpTotArr { get { return this.tr070_ImpTotArr; } }

        private string tr070_SegnoArr = "+"; // Segno totale arrotondamento (NON usato da noi sempre "+"!!!)
        public string Tr070_SegnoArr { get { return this.tr070_SegnoArr; } }

        private string tr070_CodValuta = "E"; // Codice valuta (NON usato da noi sempre "E  "!!!)
        public string Tr070_CodValuta { get { return this.tr070_CodValuta; } }

        private string tr070_FlgStpIVA = " "; // Flag libro iva già stampato (NON usato da noi sempre " "!!!)
        public string Tr070_FlgStpIVA { get { return this.tr070_FlgStpIVA; } }

        private string tr070_FlgStpGior = " "; // Flag libro giornale già stampato (NON usato da noi sempre " "!!!)
        public string Tr070_FlgStpGior { get { return this.tr070_FlgStpGior; } }

        private int tr070_NrPagGior = 0; // Nr pagina libro giornale già stampato (NON usato da noi sempre 0!!!)
        public int Tr070_NrPagGior { get { return this.tr070_NrPagGior; } }

        private int tr070_NrRigGior = 0; // Nr riga libro giornale già stampato (NON usato da noi sempre 0!!!)
        public int Tr070_NrRigGior { get { return this.tr070_NrRigGior; } }

        private string tr070_CompIVA = "C"; // Flag competenza IVA ("C"=Corrente(Default) "P"=Precedente)
        public string Tr070_CompIVA { get { return this.tr070_CompIVA; } }

        private string tr070_StatoOper = "A"; // Flag stato operazione ("A"=Attivo(Default) "S"=Simulato Confermato "X"=Simulato Eliminato)
        public string Tr070_StatoOper { get { return this.tr070_StatoOper; } }

        private int tr070_NrRegistr; // Nr progressivo di registrazione (NON è considerato per l'importazione) 
        public int Tr070_NrRegistr { get { return this.tr070_NrRegistr; } set { this.tr070_NrRegistr = value; } }

        private int tr070_CodFiliale = 1; // Codice Filiale (NON usato da noi sempre 1!!!) 
        public int Tr070_CodFiliale { get { return this.tr070_CodFiliale; } }

        private string tr070_FlagCosRic = " "; // Flag modalità assegnazione costi ricavi (NON usato da noi sempre " "!!!)
        public string Tr070_FlagCosRic { get { return this.tr070_FlagCosRic; } }

        private string tr070_FlagNoteVar = " "; // Flag note di variazione (NON usato da noi sempre " "!!!)
        public string Tr070_FlagNoteVar { get { return this.tr070_FlagNoteVar; } }

        #endregion
        public override string TransformaInStringa()
        {
            string record = TipoRecord()
            + String.Format("{0:dd/MM/yyyy}", Tr070_DataReg) // data registrazione (gg/mm/aaaa)
            + String.Format("{0:000}", Tr070_NrSezIva) // Numero della Sezione Iva (default 001)
            + String.Format("{0:0000000}", Tr070_NrProtoc) // Numero di Protocollo
            + String.Format("{0,-1}", Tr070_CompEser) // Esercizio di competenza ("C"=Corrente (Default) "P"=Precedente)
            + String.Format("{0,-1}", Tr070_MovOscCamb) // Flag movimento oscillazione cambi
            + String.Format("{0,-4}", Tr070_CausContab) // Codice di causale contabile
            + String.Format("{0,-50}", Tr070_DescrMov) // Descrizione movimento
            + String.Format("{0,-10}", Tr070_NrDocum) // Numero documento
            + String.Format("{0:dd/MM/yyyy}", Tr070_DataDocum) // Data documento (gg/mm/aaaa)
            + String.Format("{0:000}", Tr070_MastroClFo) // Mastro cliente o fornitore
            + String.Format("{0:00}", Tr070_CapocClFo) // Capoconto cliente o fornitore
            + String.Format("{0:00}", Tr070_ContoClFo) // Conto cliente o fornitore
            + String.Format("{0:00000}", Tr070_CodClFo) // Codice cliente o fornitore
            + String.Format("{0:000000000000000000}", Tr070_ImpTotDoc * 100) // Importo totale documento
            + String.Format("{0,-1}", Tr070_SegnoDoc) // Segno totale documento
            + String.Format("{0:000000000000000000}", Tr070_ImpTotArr) // Importo totale arrotondamento
            + String.Format("{0,-1}", Tr070_SegnoArr) // Segno totale arrotondamento 
            + String.Format("{0,-3}", Tr070_CodValuta) // Codice valuta
            + String.Format("{0,-1}", Tr070_FlgStpIVA) // Flag libro iva già stampato 
            + String.Format("{0,-1}", Tr070_FlgStpGior) // Flag libro giornale già stampato
            + String.Format("{0:0000000}", Tr070_NrPagGior) // Nr pagina libro giornale già stampato
            + String.Format("{0:0000000}", Tr070_NrRigGior) // Nr riga libro giornale già stampato
            + String.Format("{0,-1}", Tr070_CompIVA) // Flag competenza IVA ("C"=Corrente(Default) "P"=Precedente)
            + String.Format("{0,-1}", Tr070_StatoOper) // Flag stato operazione ("A"=Attivo(Default) "S"=Simulato Confermato "X"=Simulato Eliminato)
            + String.Format("{0:00000}", Tr070_NrRegistr) // Nr progressivo di registrazione (NON è considerato per l'importazione) 
            + String.Format("{0:00000}", Tr070_CodFiliale) // Codice Filiale 
            + String.Format("{0,-1}", Tr070_FlagCosRic) // Flag modalità assegnazione costi ricavi
            + String.Format("{0,-1}", Tr070_FlagNoteVar); // Flag note di variazione 
           
            return record;
        }

    }
    #endregion

    #region sottoclasse TipoRecord "073"
            // - Obbligatorio e Ripetibile per ogni TipoRecord 070
            // - Rigo di contropartita contabile.

    public class RecordExpertUp_073 : RecordTrasferExpertUp
    {
        public override string TipoRecord()
        {
            return "073";
        }
        #region campi del record "073"

        private int tr073_Mastro; // Mastro 
        public int Tr073_Mastro { get { return this.tr073_Mastro; } set { this.tr073_Mastro = value; } }

        private int tr073_CapoConto = 0; // Capoconto (NON usato da noi sempre 0!!!)
        public int Tr073_CapoConto { get { return this.tr073_CapoConto; } }

        private int tr073_Conto; // Conto 
        public int Tr073_Conto { get { return this.tr073_Conto; } set { this.tr073_Conto = value; } }

        private int tr073_SottoConto; // Sottoconto o cliente o fornitore
        public int Tr073_SottoConto { get { return this.tr073_SottoConto; } set { this.tr073_SottoConto = value; } }

        private string tr073_DescrContr; // Descrizione della contropartita
        public string Tr073_DescrContr { get { return this.tr073_DescrContr; } set { this.tr073_DescrContr = value; } }

        private double tr073_Importo; // Importo
        public double Tr073_Importo { get { return this.tr073_Importo; } set { this.tr073_Importo = value; } }

        private string tr073_SegnoImporto = "+"; // Segno dell'importo (NON usato da noi sempre "+"!!!)
        public string Tr073_SegnoImporto { get { return this.tr073_SegnoImporto; } }

        private string tr073_DareAvere; // Dare o Avere ("D"=Dare, "A"=Avere)
        public string Tr073_DareAvere { get { return this.tr073_DareAvere; } set { this.tr073_DareAvere = value; } }

        private string tr073_CodRagCatFin = " "; // Cod. raggruppamento categoria Finanziaria (NON usato da noi sempre " "!!!)
        public string Tr073_CodRagCatFin { get { return this.tr073_CodRagCatFin; } }

        private string tr073_CodCatFin = " "; // Cod. categoria Finanziaria (NON usato da noi sempre " "!!!)
        public string Tr073_CodCatFin { get { return this.tr073_CodCatFin; } }

        #endregion

        public override string TransformaInStringa()
        {
            string record = TipoRecord()
            + String.Format("{0:000}", Tr073_Mastro) // Mastro
            + String.Format("{0:00}", Tr073_CapoConto) // Capoconto
            + String.Format("{0:00}", Tr073_Conto) // Conto
            + String.Format("{0:00000}", Tr073_SottoConto) // Sottoconto o cliente o fornitore
            + String.Format("{0,-50}", Tr073_DescrContr) // Descrizione della contropartita
            + String.Format("{0:000000000000000000}", Tr073_Importo * 100) // Importo
            + String.Format("{0,-1}", Tr073_SegnoImporto) // Segno dell'importo
            + String.Format("{0,-1}", Tr073_DareAvere) // Dare o Avere ("D"=Dare, "A"=Avere)
            + String.Format("{0,-4}", Tr073_CodRagCatFin) // Cod. raggruppamento categoria Finanziaria 
            + String.Format("{0,-4}", Tr073_CodCatFin); // Cod. categoria Finanziaria
            return record;
        }

    }
    #endregion

    #region sottoclasse TipoRecord "076"
    // - Obbligatorio e Ripetibile per ogni TipoRecord 070
    // - Rigo Iva.

    public class RecordExpertUp_076 : RecordTrasferExpertUp
    {
        public override string TipoRecord()
        {
            return "076";
        }
        #region campi del record "076"

        private string tr076_CategBene = "001"; // Codice Categoria di Bene (NON usato da noi sempre "001"!!!)
        public string Tr076_CategBene { get { return this.tr076_CategBene; } }

        private string tr076_CodIVA; // Codice IVA
        public string Tr076_CodIVA { get { return this.tr076_CodIVA; } set { this.tr076_CodIVA = value; } }

        private double tr076_Imponibile; // Importo imponibile
        public double Tr076_Imponibile { get { return this.tr076_Imponibile; } set { this.tr076_Imponibile = value; } }

        private string tr076_SegnoImponibile = "+"; // Segno dell'importo imponibile (NON usato da noi sempre "+"!!!)
        public string Tr076_SegnoImponibile { get { return this.tr076_SegnoImponibile; } }

        private double tr076_Imposta; // Imposta (se 0 si ricalcola in base all'aliquota sul codice iva)
        public double Tr076_Imposta { get { return this.tr076_Imposta; } set { this.tr076_Imposta = value; } }

        private string tr076_SegnoImposta = "+"; // Segno dell'imposta (NON usato da noi sempre "+"!!!)
        public string Tr076_SegnoImposta { get { return this.tr076_SegnoImposta; } }

        private string tr076_RitardoIVA = " "; // Flag Iva in ritardo (NON usato da noi sempre " "!!!)
        public string Tr076_RitardoIVA { get { return this.tr076_RitardoIVA; } }

        private double tr076_PercPrevid = 0; // Percentuale previdenziale (NON usato da noi sempre 0!!!)
        public double Tr076_PercPrevid { get { return this.tr076_PercPrevid; } }

        private string tr076_FlagCosRic = " "; // Flag Suddivisione Costi/Ricavi (NON usato da noi sempre " "!!!)
        public string Tr076_FlagCosRic { get { return this.tr076_FlagCosRic; } }

        private string tr076_FlagEsclusoElenchiClFo = " "; // Flag eclusione da elenchi clienti fornitori (NON usato da noi sempre " "!!!)
        public string Tr076_FlagEsclusoElenchiClFo { get { return this.tr076_FlagEsclusoElenchiClFo; } }

        #endregion

        public override string TransformaInStringa()
        {
            string record = TipoRecord()
            + String.Format("{0,-3}", Tr076_CategBene) // Codice Categoria di Bene
            + String.Format("{0,-3}", Tr076_CodIVA) // Codice IVA
            + String.Format("{0:000000000000000000}", Tr076_Imponibile * 100) // Importo imponibile
            + String.Format("{0,-1}", Tr076_SegnoImponibile) // Segno dell'importo imponibile
            + String.Format("{0:000000000000000000}", Tr076_Imposta * 100) // Imposta
            + String.Format("{0,-1}", Tr076_SegnoImposta) // Segno dell'imposta
            + String.Format("{0,-1}", Tr076_RitardoIVA) // Flag Iva in ritardo
            + String.Format("{0:0000000}", Tr076_PercPrevid) // Percentuale previdenziale
            + String.Format("{0,-1}", Tr076_FlagCosRic) // Flag Suddivisione Costi/Ricavi
            + String.Format("{0,-1}", Tr076_FlagEsclusoElenchiClFo); // Flag eclusione da elenchi clienti fornitori
            
            return record;
        }

    }
    #endregion

    #region sottoclasse TipoRecord "079"
    // - Obbligatorio e Ripetibile per ogni TipoRecord 073
    // - Rigo Partite Aperte.

    public class RecordExpertUp_079 : RecordTrasferExpertUp
    {
        public override string TipoRecord()
        {
            return "079";
        }
        #region campi del record "079"

        private string tr079_GrupPartite = " "; // Gruppo di Partite (NON usato da noi sempre " "!!!)
        public string Tr079_GrupPartite { get { return this.tr079_GrupPartite; } }

        private int tr079_AnnoPartita; // Anno partita
        public int Tr079_AnnoPartita { get { return this.tr079_AnnoPartita; } set { this.tr079_AnnoPartita = value; } }

        private string tr079_Partita; // Partita
        public string Tr079_Partita { get { return this.tr079_Partita; } set { this.tr079_Partita = value; } }
        
        private string tr079_CodPagam; // Codice pagamento
        public string Tr079_CodPagam { get { return this.tr079_CodPagam; } set { this.tr079_CodPagam = value; } }
        
        private DateTime tr079_DataScad; // data scadenza (gg/mm/aaaa)
        public DateTime Tr079_DataScad { get { return this.tr079_DataScad; } set { this.tr079_DataScad = value; } }

        private double tr079_Importo; // Importo
        public double Tr079_Importo { get { return this.tr079_Importo; } set { this.tr079_Importo = value; } }

        private string tr079_SegnoImporto = "+"; // Segno dell'importo (NON usato da noi sempre "+"!!!)
        public string Tr079_SegnoImporto { get { return this.tr079_SegnoImporto; } }

        private string tr079_AggAgenti = "N"; // Tipo aggiornamento agenti (NON usato da noi sempre "N"!!!)
                                                // Valori possibili: N=Nessuno (default)
                                                // D=Detrae Incassato
                                                // S=Somma Incassato
        public string Tr079_AggAgenti { get { return this.tr079_AggAgenti; } }

        private string tr079_OrPartita = "F"; // Origine partita (NON usato da noi sempre "F"!!!)
                                                // Valori possibili: F=Fattura
                                                // E=Effetto
                                                // I=Insoluto
                                                // S=Salda Insoluto
                                                // V=Versamento (Incasso/Pagamento)
        public string Tr079_OrPartita { get { return this.tr079_OrPartita; } }

        private int tr079_CodAgente; // Codice agente
        public int Tr079_CodAgente { get { return this.tr079_CodAgente; } set { this.tr079_CodAgente = value; } }

        private string tr079_TipoProvv = " "; // Tipo provvigione (NON usato da noi sempre " "!!!)
                                                // Valori possibili: su F=Fatturato
                                                // I=Incassato
                                                // S=Scaduto
                                                // Per campo non valorizzato in presenza di
                                                // un agente si deduce dall'agente stesso
        public string Tr079_TipoProvv { get { return this.tr079_TipoProvv; } }

        private double tr079_PercProvv = 0; // Percentuale provvigione (NON usato da noi sempre 0!!!)
        public double Tr079_PercProvv { get { return this.tr079_PercProvv; } }
                                                 // Per campo non valorizzato in presenza di
                                                 // un agente si deduce dall'agente stesso

        private string tr079_Filler0001 = " "; // (non usato, per scopi futuri, space)
        public string Tr079_Filler0001 { get { return this.tr079_Filler0001; } }

        private string tr079_Filler0002 = " "; // (non usato, per scopi futuri, space)
        public string Tr079_Filler0002 { get { return this.tr079_Filler0002; } }

        private int tr079_AutoFatt = 0; // Switch Auto Fattura (NON usato da noi sempre 0!!!)
        public int Tr079_AutoFatt { get { return this.tr079_AutoFatt; } }

        private int tr079_AutoFattCA = 0; // Switch Auto Fattura capo area (NON usato da noi sempre 0!!!)
        public int Tr079_AutoFattCA { get { return this.tr079_AutoFattCA; } }

        private int tr079_Oscillazioni = 0; // Oscillazioni (NON usato da noi sempre 0!!!)
        public int Tr079_Oscillazioni { get { return this.tr079_Oscillazioni; } }

        private int tr079_CodCapoArea = 0; // Codice capo area (NON usato da noi sempre 0!!!)
        public int Tr079_CodCapoArea { get { return this.tr079_CodCapoArea; } }

        private string tr079_TipoProvCA = " "; // Tipo provvigione capo area (NON usato da noi sempre " "!!!)
                                                // Valori possibili: su F=Fatturato
                                                // I=Incasso
                                                // S=Scaduto
        public string Tr079_TipoProvCA { get { return this.tr079_TipoProvCA; } }

        private double tr079_PercProvCA = 0; // Percentuale provvigione capo area (NON usato da noi sempre 0!!!)
        public double Tr079_PercProvCA { get { return this.tr079_PercProvCA; } }

        private int tr079_NrRata = 0; // Numero rata (NON usato da noi sempre 0!!!)
        public int Tr079_NrRata { get { return this.tr079_NrRata; } }


        #endregion

        public override string TransformaInStringa()
        {
            string record = TipoRecord()

            + String.Format("{0,-3}", Tr079_GrupPartite) // Gruppo di Partite
            + String.Format("{0:0000}", Tr079_AnnoPartita) // Anno partita
            + String.Format("{0,-10}", Tr079_Partita.Trim()) // Partita
            + String.Format("{0,-3}", Tr079_CodPagam) // Codice pagamento
            // Rel. 02.01 (19-02-2013) vedere note in Program.cs 
            //+ String.Format("{0:dd/MM/yyyy}", Tr079_DataScad) // data scadenza (gg/mm/aaaa)
            + "          "
            + String.Format("{0:000000000000000000}", Tr079_Importo * 100) // Importo
            + String.Format("{0,-1}", Tr079_SegnoImporto) // Segno dell'importo 
            + String.Format("{0,-1}", Tr079_AggAgenti) // Tipo aggiornamento agenti
            + String.Format("{0,-1}", Tr079_OrPartita) // Origine partita
            + String.Format("{0:0000000}", Tr079_CodAgente) // Codice agente
            + String.Format("{0,-1}", Tr079_TipoProvv) // Tipo provvigione
            + String.Format("{0:0000000}", Tr079_PercProvv) // Percentuale provvigione
            + String.Format("{0,-1}", Tr079_Filler0001) // (non usato, per scopi futuri, space)
            + String.Format("{0,-1}", Tr079_Filler0002) // (non usato, per scopi futuri, space)
            + String.Format("{0:0}", Tr079_AutoFatt) // Switch Auto Fattura
            + String.Format("{0:0}", Tr079_AutoFattCA) // Switch Auto Fattura capo area
            + String.Format("{0:0}", Tr079_Oscillazioni) // Oscillazioni
            + String.Format("{0:0000000}", Tr079_CodCapoArea) // Codice capo area
            + String.Format("{0,-1}", Tr079_TipoProvCA) // Tipo provvigione capo area
            + String.Format("{0:0000000}", Tr079_PercProvCA) // Percentuale provvigione capo area
            + String.Format("{0:000}", Tr079_NrRata); // Numero rata

            return record;
        }

    }
    #endregion

    #endregion


}